import axios from 'axios';
import qs from 'qs';
//localStorage.removeItem('token');

/** 
 * 请求失败后的错误统一处理 
 * @param {Number} status 请求失败的状态码
 */
const errorHandle = (status, other) => {
  console.log('this', this)
  switch (status) {
    // 401: 未登录状态，跳转登录页
    case 401:
      localStorage.removeItem('token');
      // if (location.pathname != 'login') {
      //   router.replace('/login')
      // }
      break;
      // 403 token过期
      // 清除token并跳转登录页
    case 403:
      localStorage.removeItem('token');
      break;
      // 404请求不存在
    case 404:
      // tip('请求的资源不存在');
      break;
    default:
      console.log(other);
  }
}

var instance = axios.create({
  timeout: 1000 * 20
});

instance.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset="ISO-8859-1"';
instance.defaults.headers.post['Accept'] = 'application/json; charset=utf-8';
instance.defaults.headers.common['Authorization'] = localStorage.getItem('token') || '';


/** 
 * 请求拦截器 
 */
instance.interceptors.request.use(
  config => {
    // 登录流程控制中，根据本地是否存在token判断用户的登录情况        
    // 但是即使token存在，也有可能token是过期的，所以在每次的请求头中携带token        
    // 后台根据携带的token判断用户的登录情况，并返回给我们对应的状态码        
    // 而后我们可以在响应拦截器中，根据状态码进行一些统一的操作。        
    // const token = store.state.token;
    const token = localStorage.getItem('token');
    token && (config.headers.Authorization = token);
    return config;
  },
  error => Promise.error(error));


// 响应拦截器
instance.interceptors.response.use(
  res => res.status === 200 ? Promise.resolve(res.data) : Promise.reject(res),
  error => {
    const {
      response
    } = error;
    if (response) {
      // 请求已发出，但是不在2xx的范围 
      errorHandle(response.status, response.data.message);
      return Promise.reject(response);
    } else {
      // 处理断网的情况
      // eg:请求超时或断网时，更新state的network状态
      // network状态在app.vue中控制着一个全局的断网提示组件的显示隐藏
      // 关于断网组件中的刷新重新获取数据，会在断网组件中说明
      if (!window.navigator.onLine) {
        //  store.commit('changeNetwork', false);
      } else {
        return Promise.reject(error);
      }
    }
  });


async function toLogin() {
  let p = {
    username: "admin",
    password: "202cb962ac59075b964b07152d234b70",
    deviceType: "normal",
    isApp: "true",
    orgId: "A"
  };
  let res = await instance.post('http://106.53.221.204:8090/opus-front-sso/authentication/form', qs.stringify(p), {
    headers: {
      "Authorization": 'Basic b3B1cy1yZXN0Om9wdXMtcmVzdDEyMw==',
      "Content-Type": "application/x-www-form-urlencoded"
    }
  });
  console.log('res', res)
  const access_token = res.content.access_token;
  const tokenValue = res.content.token_type + " " + access_token;
  localStorage.setItem("token", tokenValue);
  localStorage.setItem("user", JSON.stringify(res.content.opusLoginUser.user));
  // store.commit('handleUserId', res.content.opusLoginUser.user.userId);
  // store.commit('handleUserName', res.content.opusLoginUser.user.userName);
  // if (access_token && tokenValue) {
  //   setTimeout(() => {
  //     location.reload();
  //   }, 200)
  // }
}

export default instance;